//
//  DYWOauthViewModel.swift
//  sinaWeibo
//
//  Created by 董艳武 on 16/2/15.
//  Copyright © 2016年 董艳武. All rights reserved.
//

import UIKit
import AFNetworking

class DYWOauthViewModel: NSObject {
    
    private override init() {
        super.init()
        accountModel = DYWAccountModel.getUserInfo()
    }
    
    /// 单例
    static let sharedInstance:DYWOauthViewModel = DYWOauthViewModel()
    
    /// model 属性
    var accountModel:DYWAccountModel?
    
    /// 是否登陆属性
    var isVistor:Bool {
        return accountModel == nil ? true : false 
    }
    
    /// access_token 属性
    var access_token:String? {
        return accountModel?.access_token
    }
    
    /// 用户名称属性
    var userName:String? {
        return accountModel?.screen_name
    }
    
    /// 用户头像的 url 属性
    var userImgUrl:NSURL? {
        return NSURL(string: accountModel?.avatar_large ?? "")
    }

    /// 导入数据的函数
    func loadData (code:String,success:() -> (),failure:(error:NSError) -> ()) {
        
        let manager = AFHTTPSessionManager()
        //增加解析方法
        manager.responseSerializer.acceptableContentTypes?.insert("text/plain")
        /*
        
        必选	类型及范围	说明
        client_id	true	string	申请应用时分配的AppKey。
        client_secret	true	string	申请应用时分配的AppSecret。
        grant_type	true	string	请求的类型，填写authorization_code
        
        grant_type为authorization_code时
        必选	类型及范围	说明
        code	true	string	调用authorize获得的code值。
        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
        */
        
        let params = [
            "client_id": app_Key,
            "client_secret": app_Secret,
            "grant_type": "authorization_code",
            "code" : code,
            "redirect_uri":redirect_URL
        ]
        manager.POST("https://api.weibo.com/oauth2/access_token", parameters: params, success: { (_ , JSON) -> Void in
            /*
            "access_token" = "2.00Fth7HCOKoSUC7c83db067cp3pNcC";
            "expires_in" = 157679999;
            "remind_in" = 157679999;
            uid = 1942065251;
            */
            print(JSON)
            // 字典转模型
            // 把 json 进行转换
            let dict = JSON as? [String:AnyObject]
            
            if let modelDict = dict {
                let account = DYWAccountModel(dict: modelDict)
//                print(account ?? "空值")
                //                print(account.expires_date)
                // 获取到token 进行 获取个人用户信息的请求
                // 第三步 获取个人用户信息
                self.loadUserInfo(account, success: success, failure: failure)
            }
            
            }) { (_ , error) -> Void in
                print(error)
        }
    }
    
    
    /// 导入用户数据的函数
    func loadUserInfo(model:DYWAccountModel,success:() -> (),failure:(error:NSError) -> ()) {
        
        if model.access_token == nil || model.uid == nil {
            fatalError("access_token 和 uid 不能为 nil")
        }
        
        // 创建 afn
        let manager = AFHTTPSessionManager()
        /*
        
        必选	类型及范围	说明
        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        uid	false	int64	需要查询的用户ID。
        screen_name	false	string	需要查询的用户昵称。
        
        参数uid与screen_name二者必选其一，且只能选其一；
        
        
        */
        // string ： string？ 这个类型对于 anyobject？ 不能够转换 我们 必须 string：string？ 转换成 string：string
        let params = [
            
            "access_token":model.access_token!,
            "uid":model.uid!
            
        ]
        // 获取用户数据
        manager.GET("https://api.weibo.com/2/users/show.json", parameters: params, success: { (_ , JSON) -> Void in
            let dict = JSON as? [String:AnyObject]
            
//            print(dict)
            
            guard let modelDict = dict else {
                return
            }
            /*
            modelDict 是一个[string:anyobject]类型的字典
            通过 key 获取到的值是 anyobject
            model.screen_name 是 string 类型的
            不同类型不可以直接复制  所以要把 anyobject 转换为 string
            
            as？ 和 as！ 取决于前面的值
            */
            model.screen_name = modelDict["screen_name"] as? String
            model.avatar_large = modelDict["avatar_large"] as? String
            
            self.accountModel = model
            // 保存数据
            self.accountModel!.saveInfo()
            // 告诉第一个方法这里都成功了
            success()
            
            }) { (_ , error) -> Void in
                failure(error: error)
        }
    }

}
